package comportamientos;

import com.uqbar.arkanoid.ArkanoidScene;
import com.uqbar.arkanoid.Vector2D;
import com.uqbar.componentes.Ladrillo;
import com.uqbar.componentes.Pelota;
import com.uqbar.vainilla.colissions.CollisionDetector;

public class ColisionLadrilloRule implements PelotaRule {
	
	private Ladrillo ladrillo;
	private static double anguloMayor = Math.PI/3;
	private static double anguloMenor = -Math.PI/3;

	public ColisionLadrilloRule(Ladrillo ladrillo) {
		super();
		this.ladrillo = ladrillo;
	}

	@Override
	public boolean mustApply(Pelota pelota, Vector2D nuevaPosicion,	ArkanoidScene scene) {
		
		return this.colisiona(ladrillo, pelota, nuevaPosicion) ;
	}

	@Override
	public void apply(Pelota pelota, Vector2D nuevaPosicion, ArkanoidScene scene) {
		
		double puntoDeColision = getPuntoColision(ladrillo, pelota, nuevaPosicion);

		double signoY = Math.signum(pelota.getDireccion().getY());

		double anguloNuevo = ((anguloMayor - anguloMenor) / ladrillo.getAppearance().getWidth())	* puntoDeColision + anguloMenor;
		// aprovecho e invierto el signo que traia Y con el truquito de
		// multiplicarlo por -1
		pelota.setDireccion(new Vector2D(Math.sin(anguloNuevo), (-1) * signoY * Math.cos(anguloNuevo)));

		// pelota.setX(nuevaPosicion.getX());
		pelota.setY(signoY > 0 ? ladrillo.getY()	- pelota.getAppearance().getHeight() - 1 : ladrillo.getY() + ladrillo.getAppearance().getHeight() + 1);
		
		//pelota.masRapido();
		
		///////////////////////////////////
		// hacer que el ladrillo desaparezca
		///////////////////////////////////
		
		this.ladrillo.sacarDePantalla();
		this.ladrillo.destroy();
		scene.getMarcador().incrementarPuntos(100,scene);
	}
	
	private boolean colisiona(Ladrillo ladrillo, Pelota pelota, Vector2D nuevaPosicion) {
		return CollisionDetector.INSTANCE.collidesCircleAgainstRect(
				nuevaPosicion.getX(), nuevaPosicion.getY(), pelota.getAppearance().getWidth() / 2, ladrillo.getX(),
				ladrillo.getY(), ladrillo.getAppearance().getWidth(), ladrillo.getAppearance().getHeight());
	}
	
	private double getPuntoColision(Ladrillo ladrillo, Pelota pelota,Vector2D nuevaPosicion) {
		
		if (pelota.getX() > ladrillo.getX()	&& pelota.getX() + pelota.getAppearance().getWidth() < ladrillo.getX() + ladrillo.getAppearance().getWidth()) {
			double xCentroPelota = nuevaPosicion.getX()	+ pelota.getAppearance().getWidth() / 2;
			return xCentroPelota - ladrillo.getX();
			
		} else if (pelota.getX() < ladrillo.getX()) {
			return 0;
			
		} else {
			return ladrillo.getAppearance().getWidth();
		}
	}

}
